﻿/**
 * @file hal_key.c
 * @brief this is a brief description
 * @details this is the detail description.
 * @author fulong 
 * @data 8/1/2014
 * @version 1.0
 * @par Copyright (c):
 * @par First build
 *     version: fulong 
 *     data: 8/1/2014
 */
#include "hal_key.h"
#include "../dev/key.h"
#include "../dev/uart.h"
#ifdef __STM32
    #include "../bsp/arch/stm32/stm32f1xx/STM32F10x_StdPeriph_Driver/inc/stm32f10x_usart.h"
#endif

extern cur_key_status cur_key;
extern uint8 hal_key_continue_received;


hal_key_struct hal_key_proc;

void hal_key_init(void)
{
    uint8 i;
    for (i = 0; i < HAL_KEY_LEN_MAX; i++)
    {
        hal_key_proc.hal_key_len = 0;
        hal_key_proc.hal_key_saved[i] = HAL_KEY_UNPRESS;
        hal_key_proc.hal_key_status[i] = HAL_KEY_UNPRESS_STATUS;
    }
}
/*! \brief 更新缓冲池中的键值,将使用过的键值清除掉
* \param used_key_id 使用过的键值所处的缓冲池位置
* \retrun void
*/
void update_key_value(uint8 used_key_id)
{
    if (hal_key_proc.hal_key_len > 0)
    {
        hal_key_proc.hal_key_saved[used_key_id] =  hal_key_proc.hal_key_saved[hal_key_proc.hal_key_len - 1];
        hal_key_proc.hal_key_status[used_key_id] = hal_key_proc.hal_key_saved[hal_key_proc.hal_key_len - 1];
        hal_key_proc.hal_key_saved[hal_key_proc.hal_key_len - 1] = HAL_KEY_UNPRESS;
        hal_key_proc.hal_key_status[hal_key_proc.hal_key_len - 1] = HAL_KEY_UNPRESS_STATUS;
        hal_key_proc.hal_key_len--;
    }
}
/*! \brief 清理缓冲池中没用的键值
* \param void
* \retrun void
*/
void clr_unuse_key_value(void)
{
    hal_key_init();
}
/*! \brief 将接收到的键值保存在缓冲池上。
* \param void
* \retrun void
*/
static void hal_key_save(void)
{
    if (cur_key.used == KEY_RECEIVED)
    {
        //缓冲池到了边界了
        if (hal_key_proc.hal_key_len == (HAL_KEY_LEN_MAX - 1))
        {
            clr_unuse_key_value();
        }
        switch (cur_key.status)
        {
            case KEY_PRESS:
                hal_key_proc.hal_key_saved[hal_key_proc.hal_key_len] = cur_key.union_key.key;
                hal_key_proc.hal_key_status[hal_key_proc.hal_key_len] = HAL_KEY_PRESS_STATUS;
                hal_key_proc.hal_key_len++;
                cur_key.status = KEY_INIT;
                cur_key.union_key.key = KEY_UNPRESS;
                cur_key.used = KEY_PROCESSED;
                break;
            case KEY_CONTINUE_PRESS:
                if (hal_key_continue_received == 0)
                {
                    hal_key_proc.hal_key_status[hal_key_proc.hal_key_len] = HAL_KEY_CONTINUE_PRESS_STATUS;
                    hal_key_proc.hal_key_saved[hal_key_proc.hal_key_len] = cur_key.union_key.key;
                    hal_key_proc.hal_key_len++;
                    hal_key_continue_received = 1;
                }
                break;
            default:
                break;
        }
    }
}
void query_key_status(void)
{
    key_status_mechine();
    hal_key_save();
}
